#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<time.h>
#include<sys/time.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>

int fd;
int flag = 0;

void myfunction(int signo)
{
	//收到SIGALM信号后表示两秒钟到了，执行相关工作
	if(flag==0)
	{
		//打开文件
		fd = open("./deamon.log",O_RDWR | O_CREAT | O_APPEND,0777);
		if(fd<0)
		{
			//守护进程不受控制端影响
			return;
		}
		flag =1;
	}
	//获取当前时间
	time_t t;
	time(&t);
	char* p = ctime(&t);

	//讲文件写入文件
	write(fd,p,strlen(p));

	close(fd);

	return;
}

int main()
{
	//1、父进程fork子进程
	int pid = fork();
	if(pid<0)
	{
		perror("fork error");
		exit(1);
	}
	if(pid>0) //父进程，直接退出
	{
		kill(getpid(),SIGKILL);
	}
	if(pid==0) //子进程，调用setsid函数
	{
		//子进程调用setsid函数创建会话
		setsid();


		//改变当前的工作目录
		chdir("/home/amax/Documents/Linux编程");

		//改变文件掩码
		umask(0000);

		//关闭标准输入，输出，错误输出
		close(STDIN_FILENO);
		close(STDOUT_FILENO);
		close(STDERR_FILENO);

		//核心操作
		//注册信号处理函数
		struct sigaction act;
		act.sa_handler = myfunction;
		act.sa_flags = 0;
		sigemptyset(&act.sa_mask);
		sigaction(SIGALRM,&act,NULL);

		//设置定时器，调用setitimer   会周期性的发送SIGALRM信号
		struct itimerval itm;
		itm.it_interval.tv_sec = 2;
		itm.it_interval.tv_usec = 0;

		itm.it_value.tv_sec = 2;
		itm.it_value.tv_usec = 0;
		setitimer(ITIMER_REAL,&itm,NULL);

		//让子进程不会结束
		while(1)
		{
			int size = lseek(fd,0,SEEK_END);
			if(size > 100)
			{
				close(fd);
				rename("./demon.log","./demon.log.bak");
				flag = 0;
			}
		}

	}

	return 0;
}
